package com.seataxa.order.config;

import com.alibaba.druid.pool.DruidDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import io.seata.rm.datasource.xa.DataSourceProxyXA;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/****************************************************
 * JDBC 相关配置
 *
 * @author lbf
 * @date 2025/7/16 15:04
 ****************************************************/
@Configuration
public class JDBCConfig {

    @Bean
    /**
     * 在 @Bean 方法上使用 注解 @ConfigurationProperties，表示将指定前缀的配置绑定到指定Bean对象的同名称的属性上(属性的setter方法)
     */
    @ConfigurationProperties(prefix = "spring.datasource")
    public DruidDataSource druidDataSource(){
        return new DruidDataSource();
    }

    /**
     * 使用Druid 连接池，
     * 注意：这是手动配置JDBC数据源时数据库连接池的用法
     *
     * 另外，Seata AT 模式 与 Seata XA 模式在使用上主要是数据源不同；通过
     * 切换数据源可以实现 AT 与 XA 的切换
     *
     * @param druidDataSource
     * @return
     */
    @Bean("dataSourceProxy")
    public DataSource dataSource(DruidDataSource druidDataSource){

        /**
         * Seata AT 模式的数据源
         */
        //DataSource dataSourceAt = new DataSourceProxy(druidDataSource);

        /**
         * Seata XA 模式的数据源
         */
        DataSource dataSourceXa = new DataSourceProxyXA(druidDataSource);

        return dataSourceXa;

    }

    /**
     *  JdbcTemplate 与 Mybatis 的区别？
     *
     * @param dataSourceProxy
     * @return
     */
    //@Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSourceProxy){

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSourceProxy);
        return jdbcTemplate;
    }

    /**
     * 为mybatis 指定数据源
     * 这里为mybatis指定 Seata XA 模式的数据源 DataSourceProxyXA
     * @param dataSourceProxy
     * @return
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSourceProxy){

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSourceProxy);

        return sqlSessionFactoryBean;
    }
}
